/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package aqu.controlador.CuentasPorPagar;


import aqu.bean.generico.BeanGenerico;
import aqu.controlador.Contabilidad.PlanCuentasController;
import aqu.persistencia.Dao.Contabilidad.ConCabeceracontableManager;
import aqu.persistencia.Dao.Contabilidad.ConDetallecontableManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpCabecerafacturaManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpCabeceraretencionManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpDetalleRetencionManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpDetallefacturaManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpEstadoFacturaManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpProveedorManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpRetencionManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpTipoContribuyenteRetencionManager;
import aqu.persistencia.entity.*;
import aqu.persistencia.entity.CxpImpuesto;
import aqu.persistencia.utilidad.MessagesController;
import aqu.persistencia.utilidad.Reportes;
import aqu.persistencia.utilidad.TotalDetalle;
import com.icesoft.faces.component.ext.RowSelectorEvent;
import i18n.Constantes;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;


/**
 *
 * @author Verito Ramirez
 *         Victor Jaramillo
 */    
@ManagedBean(name = "facturaTransController")
@ViewScoped
public class FacturaTransController extends BeanGenerico {

    private CxpCabeceraFactura cabeceraFactura;
    private CxpDetalleFactura detalleFactura;
    private CxpEstadoFactura estadofacturaGroup; 
    private CxpProveedor proveedorGroup;
    private CxpCabeceraRetencion retencionGroup, cabeceraRetencion;
    private CxpDetalleRetencion detalleRetencionGroup;
    private CxpRetencion retencionDetalleGroup;
    private CxpTipoContribuyenteRetencion tipoConRet;
    private ConCabeceracontable cabeceraContable;
    private ConDetallecontable detalleContable;
    private CxpProveedor proveedorAux;
    
    private List<CxpCabeceraFactura> listaCabecera;
    private List<CxpDetalleFactura> listaDetalle;      
    private List<CxpEstadoFactura> listaEstadoFactura;
    private List<CxpProveedor> listaProveedor;
    private List<CxpCabeceraRetencion> listaCabeceraRetencion;
    private List<CxpRetencion> listaRetencionDet;
    private List<CxpTipoContribuyenteRetencion> listaTipConReT;
    private List<ConCabeceracontable> listaCabeceraContable;
    private List<ConDetallecontable> listaDetalleContable;
    private List<CxpDetalleRetencion> listaDetalleRetencion;
    
    private CxpCabecerafacturaManager CxpCabecerafacturaManager = new CxpCabecerafacturaManager();   
    private CxpDetallefacturaManager CxpDetallefacturaManager = new CxpDetallefacturaManager();
    private CxpEstadoFacturaManager CxpEstadoFacturaManager = new CxpEstadoFacturaManager();
    private CxpProveedorManager CxpProveedorManager= new CxpProveedorManager();
    private CxpCabeceraretencionManager cxpCabeceraretencionManager = new CxpCabeceraretencionManager();
    private CxpRetencionManager cxpRetencionManager = new CxpRetencionManager();
    private CxpTipoContribuyenteRetencionManager cxpTipoConRetManager = new CxpTipoContribuyenteRetencionManager();
    private ConCabeceracontableManager conCabeceraContableManager = new ConCabeceracontableManager();
    private ConDetallecontableManager conDetallecontableManager = new ConDetallecontableManager();
    private CxpDetalleRetencionManager cxpDetalleRetencionManager = new CxpDetalleRetencionManager();
    
    private TotalDetalle totalDetalle;
    private List<TotalDetalle> listaTotalDetalle;
    private Date FecInicio;
    private Date FecFin = new Date();
    private boolean panelvisible;
    private int rowBanderaDetalle = -1;
    //private double totalDetalle = 0.0, iva = 0.0;
    
    public FacturaTransController() {

        int dias = Integer.parseInt(MessagesController.obtenervariable("var_fecha_ini_default"));
        
        cabeceraFactura = new CxpCabeceraFactura();
        detalleFactura = new CxpDetalleFactura();
        estadofacturaGroup=new CxpEstadoFactura();
        proveedorGroup = new CxpProveedor();
        retencionGroup=new CxpCabeceraRetencion();
        cabeceraRetencion = new CxpCabeceraRetencion();
        detalleRetencionGroup = new CxpDetalleRetencion();
        retencionDetalleGroup = new CxpRetencion();
        tipoConRet = new CxpTipoContribuyenteRetencion();
        cabeceraContable = new ConCabeceracontable();
        detalleContable = new ConDetallecontable();
        proveedorAux = new CxpProveedor();
        
        listaEstadoFactura = CxpEstadoFacturaManager.getList();
        listaProveedor=CxpProveedorManager.getListOrdenado("cxpNombrePro");        
        listaCabeceraRetencion= cxpCabeceraretencionManager.getList();
        listaCabecera = CxpCabecerafacturaManager.getList();
        listaRetencionDet = cxpRetencionManager.getList();
        listaTipConReT = cxpTipoConRetManager.getList();
        listaDetalleRetencion = new ArrayList<CxpDetalleRetencion>();
        listaDetalleContable = new ArrayList<ConDetallecontable>();
        
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DATE, -dias);
        Date date = c.getTime();
        FecInicio = date;
        totalDetalle = new TotalDetalle();
        listaTotalDetalle = new ArrayList<TotalDetalle>();
        listaTotalDetalle.add(totalDetalle);
    }    

    public void switchCabecera(CxpCabeceraFactura cabeceraFactura) {
        estadofacturaGroup = cabeceraFactura.getCxpCodigoEstFac();
        proveedorGroup=cabeceraFactura.getCxpCodigoPro();
        
        if(cabeceraFactura.getCxpCodigoCabret() != null)
            retencionGroup=cabeceraFactura.getCxpCodigoCabret();
        else
            retencionGroup.setCxpCodigoCabret("-");

    }

    public CxpProveedor getProveedorAux() {
        return proveedorAux;
    }

    public void setProveedorAux(CxpProveedor proveedorAux) {
        this.proveedorAux = proveedorAux;
    }

    
    public CxpCabeceraRetencion getCabeceraRetencion() {
        return cabeceraRetencion;
    }

    public void setCabeceraRetencion(CxpCabeceraRetencion cabeceraRetencion) {
        this.cabeceraRetencion = cabeceraRetencion;
    }

    public CxpDetalleRetencionManager getCxpDetalleRetencionManager() {
        return cxpDetalleRetencionManager;
    }

    public void setCxpDetalleRetencionManager(CxpDetalleRetencionManager cxpDetalleRetencionManager) {
        this.cxpDetalleRetencionManager = cxpDetalleRetencionManager;
    }

    public CxpDetalleRetencion getDetalleRetencionGroup() {
        return detalleRetencionGroup;
    }

    public void setDetalleRetencionGroup(CxpDetalleRetencion detalleRetencionGroup) {
        this.detalleRetencionGroup = detalleRetencionGroup;
    }

    public List<CxpDetalleRetencion> getListaDetalleRetencion() {
        return listaDetalleRetencion;
    }

    public void setListaDetalleRetencion(List<CxpDetalleRetencion> listaDetalleRetencion) {
        this.listaDetalleRetencion = listaDetalleRetencion;
    }

    public ConCabeceracontable getCabeceraContable() {
        return cabeceraContable;
    }

    public void setCabeceraContable(ConCabeceracontable cabeceraContable) {
        this.cabeceraContable = cabeceraContable;
    }

    public ConCabeceracontableManager getConCabeceraContableManager() {
        return conCabeceraContableManager;
    }

    public void setConCabeceraContableManager(ConCabeceracontableManager conCabeceraContableManager) {
        this.conCabeceraContableManager = conCabeceraContableManager;
    }

    public ConDetallecontableManager getConDetallecontableManager() {
        return conDetallecontableManager;
    }

    public void setConDetallecontableManager(ConDetallecontableManager conDetallecontableManager) {
        this.conDetallecontableManager = conDetallecontableManager;
    }

    public ConDetallecontable getDetalleContable() {
        return detalleContable;
    }

    public void setDetalleContable(ConDetallecontable detalleContable) {
        this.detalleContable = detalleContable;
    }

    public List<ConCabeceracontable> getListaCabeceraContable() {
        return listaCabeceraContable;
    }

    public void setListaCabeceraContable(List<ConCabeceracontable> listaCabeceraContable) {
        this.listaCabeceraContable = listaCabeceraContable;
    }

    public List<ConDetallecontable> getListaDetalleContable() {
        return listaDetalleContable;
    }

    public void setListaDetalleContable(List<ConDetallecontable> listaDetalleContable) {
        this.listaDetalleContable = listaDetalleContable;
    }

    
    public List<TotalDetalle> getListaTotalDetalle() {
        return listaTotalDetalle;
    }

    public void setListaTotalDetalle(List<TotalDetalle> listaTotalDetalle) {
        this.listaTotalDetalle = listaTotalDetalle;
    }

    public TotalDetalle getTotalDetalle() {
        return totalDetalle;
    }

    public void setTotalDetalle(TotalDetalle totalDetalle) {
        this.totalDetalle = totalDetalle;
    }
    
    public CxpTipoContribuyenteRetencionManager getCxpTipoConRetManager() {
        return cxpTipoConRetManager;
    }

    public void setCxpTipoConRetManager(CxpTipoContribuyenteRetencionManager cxpTipoConRetManager) {
        this.cxpTipoConRetManager = cxpTipoConRetManager;
    }

    public Date getFecFin() {
        return FecFin;
    }

    public void setFecFin(Date FecFin) {
        this.FecFin = FecFin;
    }

    public Date getFecInicio() {
        return FecInicio;
    }

    public void setFecInicio(Date FecInicio) {
        this.FecInicio = FecInicio;
    }

    public List<CxpTipoContribuyenteRetencion> getListaTipConReT() {
        listaTipConReT = cxpTipoConRetManager.buscarTipoContribuyente(
                cabeceraFactura.getCxpCodigoPro().getCxpCodigoTipCon(),
                detalleFactura.getCxpCodigoRet());
        return listaTipConReT;
    }

    public void setListaTipConReT(List<CxpTipoContribuyenteRetencion> listaTipConReT) {
        this.listaTipConReT = listaTipConReT;
    }

    public CxpTipoContribuyenteRetencion getTipoConRet() {
        return tipoConRet;
    }

    public void setTipoConRet(CxpTipoContribuyenteRetencion tipoConRet) {
        this.tipoConRet = tipoConRet;
    }

    public CxpCabecerafacturaManager getCxpCabecerafacturaManager() {
        return CxpCabecerafacturaManager;
    }

    public CxpRetencionManager getCxpRetencionManager() {
        return cxpRetencionManager;
    }

    public void setCxpRetencionManager(CxpRetencionManager cxpRetencionManager) {
        this.cxpRetencionManager = cxpRetencionManager;
    }

    public List<CxpRetencion> getListaRetencionDet() {
        listaRetencionDet = cxpRetencionManager.getList();
        return listaRetencionDet;
    }

    public void setListaRetencionDet(List<CxpRetencion> listaRetencionDet) {
        this.listaRetencionDet = listaRetencionDet;
    }

    public CxpRetencion getRetencionDetalleGroup() {
        return retencionDetalleGroup;
    }

    public void setRetencionDetalleGroup(CxpRetencion retencionDetalleGroup) {
        this.retencionDetalleGroup = retencionDetalleGroup;
    }
    
    public int getRowBanderaDetalle() {
        return rowBanderaDetalle;
    }

    public void setRowBanderaDetalle(int rowBanderaDetalle) {
        this.rowBanderaDetalle = rowBanderaDetalle;
    }
    
    public void setCxpCabecerafacturaManager(CxpCabecerafacturaManager CxpCabecerafacturaManager) {
        this.CxpCabecerafacturaManager = CxpCabecerafacturaManager;
    }

    public CxpDetallefacturaManager getCxpDetallefacturaManager() {
        return CxpDetallefacturaManager;
    }

    public void setCxpDetallefacturaManager(CxpDetallefacturaManager CxpDetallefacturaManager) {
        this.CxpDetallefacturaManager = CxpDetallefacturaManager;
    }

    public CxpEstadoFacturaManager getCxpEstadoFacturaManager() {
        return CxpEstadoFacturaManager;
    }

    public void setCxpEstadoFacturaManager(CxpEstadoFacturaManager CxpEstadoFacturaManager) {
        this.CxpEstadoFacturaManager = CxpEstadoFacturaManager;
    }

    public CxpProveedorManager getCxpProveedorManager() {
        return CxpProveedorManager;
    }

    public void setCxpProveedorManager(CxpProveedorManager CxpProveedorManager) {
        this.CxpProveedorManager = CxpProveedorManager;
    }

    public CxpCabeceraretencionManager getCxpCabeceraretencionManager() {
        return cxpCabeceraretencionManager;
    }

    public void setCxpCabeceraretencionManager(CxpCabeceraretencionManager cxpCabeceraretencionManager) {
        this.cxpCabeceraretencionManager = cxpCabeceraretencionManager;
    }

    public CxpCabeceraFactura getCabeceraFactura() {
        return cabeceraFactura;
    }

    public void setCabeceraFactura(CxpCabeceraFactura cabeceraFactura) {
        this.cabeceraFactura = cabeceraFactura;
    }

    public CxpDetalleFactura getDetalleFactura() {
        return detalleFactura;
    }

    public void setDetalleFactura(CxpDetalleFactura detalleFactura) {
        this.detalleFactura = detalleFactura;
    }

    public CxpEstadoFactura getEstadofacturaGroup() {
        return estadofacturaGroup;
    }

    public void setEstadofacturaGroup(CxpEstadoFactura estadofacturaGroup) {
        this.estadofacturaGroup = estadofacturaGroup;
    }

    public List<CxpCabeceraFactura> getListaCabecera() {
        //listaCabecera = CxpCabecerafacturaManager.getList();
        String parametro ="";
        if(proveedorAux.getCxpCodigoPro() != null)
            parametro = proveedorAux.getCxpCodigoPro();
        else
            parametro = "-";
        if(parametro.equals("-"))
            listaCabecera = CxpCabecerafacturaManager.buscarporFecha(FecInicio, FecFin);
        else
            listaCabecera = CxpCabecerafacturaManager.buscarPorProveedor(proveedorAux);
        return listaCabecera;
    }

    public void setListaCabecera(List<CxpCabeceraFactura> listaCabecera) {
        this.listaCabecera = listaCabecera;
    }

    public List<CxpDetalleFactura> getListaDetalle() {
         return listaDetalle;
    }

    public void setListaDetalle(List<CxpDetalleFactura> listaDetalle) {
        this.listaDetalle = listaDetalle;
    }

    public List<CxpEstadoFactura> getListaEstadoFactura() {
        return listaEstadoFactura;
    }

    public void setListaEstadoFactura(List<CxpEstadoFactura> listaEstadoFactura) {
        this.listaEstadoFactura = listaEstadoFactura;
    }

    public List<CxpProveedor> getListaProveedor() {
        return listaProveedor;
    }

    public void setListaProveedor(List<CxpProveedor> listaProveedor) {
        this.listaProveedor = listaProveedor;
    }

    public List<CxpCabeceraRetencion> getListaCabeceraRetencion() {
        return listaCabeceraRetencion;
    }

    public void setListaCabeceraRetencion(List<CxpCabeceraRetencion> listaCabeceraRetencion) {
        this.listaCabeceraRetencion = listaCabeceraRetencion;
    }

   

    public boolean isPanelvisible() {
        return panelvisible;
    }

    public void setPanelvisible(boolean panelvisible) {
        this.panelvisible = panelvisible;
    }
    
    public void llamarPanelvisible(ActionEvent event) {
        panelvisible = !panelvisible;
    }

    public CxpProveedor getProveedorGroup() {
        return proveedorGroup;
    }

    public void setProveedorGroup(CxpProveedor proveedorGroup) {
        this.proveedorGroup = proveedorGroup;
    }

    public CxpCabeceraRetencion getRetencionGroup() {
        return retencionGroup;
    }

    public void setRetencionGroup(CxpCabeceraRetencion retencionGroup) {
        this.retencionGroup = retencionGroup;
    }
    
    public void reporte(ActionEvent actionEvent){
        try {
            if(cabeceraFactura.getCxpCodigoCabfac() == null)
                throw new Exception(Constantes.ELEGIR_REGISTRO);
            Reportes reporte = new Reportes();
            String nomArchivo = "CxpFactura";
            Map parametro = new HashMap();
            parametro.put("numCabFactura", cabeceraFactura.getCxpCodigoCabfac());
            reporte.runReporte(nomArchivo, parametro);
        } catch (Exception ex) {
            Logger.getLogger(PlanCuentasController.class.getName()).log(Level.SEVERE, null, ex);
            MessagesController.addInfo("Mensaje de error :", ex.getMessage());
            llamarPanelvisible(null);
        }
    }
    
    public void nuevo(ActionEvent actionEvent) {
        cabeceraFactura = new CxpCabeceraFactura();        
        cabeceraFactura.setCxpFechaVencimientoCabfac(FecFin);
    }

    public String eliminar() {
        String cabretencion=retencionGroup.getCxpCodigoCabret();
        try {
            
            if (!cabretencion.equals("-")) {
                cabeceraFactura.setCxpCodigoCabret(retencionGroup);
            } 
            
            else {
                
                cabeceraFactura.setCxpCodigoCabret(null);
            }
            CxpCabeceraFactura cabecerafacturaTemp = (CxpCabeceraFactura) (cabeceraFactura);
            if (CxpCabecerafacturaManager.delete(cabecerafacturaTemp) == false) {
                llamarPanelvisible(null);

            }
           
            cabeceraFactura=new CxpCabeceraFactura();
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

        return "index";

    }

    public void insertar(ActionEvent actionEvent) {        
        String cabretencion=retencionGroup.getCxpCodigoCabret();
        String numFactura = "";
        try {
            cabeceraFactura.setCxpCodigoCabfac(MessagesController.obtenerkeyautomatico("cxp_cabecerafactura", "CXP_CODIGO_CABFAC"));
            cabeceraFactura.setCxpCodigoEstFac(estadofacturaGroup);
            cabeceraFactura.setCxpCodigoPro(proveedorGroup);
            /*
            //VAlidacion de Serie
            if(cabeceraFactura.getCxpCodigoPro().getCxpSeriePro()!=null || 
                    cabeceraFactura.getCxpCodigoPro().getCxpSeriePro().equals("")){
                MessagesController.validarSerie(cabeceraFactura.getCxpSerieCabFac());
                MessagesController.validarSerieAutorizacion(cabeceraFactura.getCxpCodigoPro().getCxpSeriePro(),
                        cabeceraFactura.getCxpSerieCabFac());
             }
            //Validacion de Autorizacion
            if(cabeceraFactura.getCxpCodigoPro().getCxpAutorizacionPro() != null || cabeceraFactura.getCxpCodigoPro().getCxpAutorizacionPro().equals(""))
                MessagesController.validarSerieAutorizacion(cabeceraFactura.getCxpCodigoPro().getCxpAutorizacionPro(), 
                    cabeceraFactura.getCxpAutorizacionCabFac());
            */
            if(cabeceraFactura.getCxpNumeroCabfac() == null)
                throw  new Exception("El Número de Factura no puede ir en blanco");
            else{
                numFactura = cabeceraFactura.getCxpNumeroCabfac();
                numFactura = MessagesController.LlenarConCeros(numFactura, 
                        Integer.parseInt(MessagesController.obtenervariable("tam_NumFactura")));
            }           
            cabeceraFactura.setCxpNumeroCabfac(numFactura);            
            if (!cabretencion.equals("-"))
                cabeceraFactura.setCxpCodigoCabret(retencionGroup);
            else               
                cabeceraFactura.setCxpCodigoCabret(null);
            if (CxpCabecerafacturaManager.create(cabeceraFactura) == false) {
                llamarPanelvisible(null);                
            }
            cabeceraFactura=new CxpCabeceraFactura();
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

    }

    public void modificar(ActionEvent actionEvent) {
       String cabretencion=retencionGroup.getCxpCodigoCabret(); 
       String numFactura = "";
        try {
            if(cabeceraFactura.getCxpNumeroCabfac() == null)
                throw  new Exception("El Numero de Factura no puede ir en blanco");
            else{
                numFactura = cabeceraFactura.getCxpNumeroCabfac();
                numFactura = MessagesController.LlenarConCeros(numFactura, 
                        Integer.parseInt(MessagesController.obtenervariable("tam_NumFactura")));
            }                    
            cabeceraFactura.setCxpCodigoEstFac(estadofacturaGroup);
            cabeceraFactura.setCxpCodigoPro(proveedorGroup);
            if(!cabretencion.equals("-"))
            {
                cabeceraFactura.setCxpCodigoCabret(retencionGroup);
            }
            else {
                cabeceraFactura.setCxpCodigoCabret(null);
            }
            
            if (CxpCabecerafacturaManager.update(cabeceraFactura) == false) {
                llamarPanelvisible(null);

            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }


    }

    public void guardarDetalle(ActionEvent actionEvent) {
        
        try {
            /*
             * cabeceraContable)lista); cabeceraFactura (lista); cabeceraRetencion(lista); 
             * detalleContable(lista); detalleFactura(lista); detalleRetencionGroup(lista);
             * listaDetalleContable(lista); listaDetalleRetencion(lista);
             */
            CxpEstadoRetencion estRetencion = new CxpEstadoRetencion();
            CxpTipoDocumento tipoDocumento = new CxpTipoDocumento();
            CxpDetalleRetencion detalleRetencionAux = new CxpDetalleRetencion();
            CxpImpuesto impuesto= new CxpImpuesto();
            ConCuenta conCuentaAux = new ConCuenta();
            ConEstadoCabecera conEstCab = new ConEstadoCabecera();
            ConLugarAplicacion conLugAplcacion = new ConLugarAplicacion();
            ConTipoAsiento tipoAsiento = new ConTipoAsiento();
            Date fechaHoy = new Date();
            Double totalFactAux =0.0, ValorFacRet = 0.0;
            int Bandera = 1;
            int numDetalles = listaDetalle.size();
            BigDecimal porcentaje;
            Double Subtotal = 0.0, iva = 0.0, ivaRetencion = 0.0, retencion = 0.0,
                    porcentajeIVA;
            String aplicaIVA , aplicaRet, lugarAplica;
            aplicaRet = listaDetalle.get(0).getCxpAplicaRetDetFact();
            aplicaIVA = listaDetalle.get(0).getCxpAplicaIvaDetFac();
            porcentajeIVA = Double.parseDouble(MessagesController.obtenervariable("impuesto_IVA"));
            
            estRetencion.setCxpCodigoEstRet("1");
            tipoDocumento.setCxpCodigoTipDoc("1");   
            conCuentaAux.setConCodigoCue("1.");
            
            detalleFactura = listaDetalle.get(0);
            
            //Llenar Cabecear de Retencion
            cabeceraRetencion.setCxpCodigoCabret(MessagesController.obtenerkeyautomatico("cxp_cabeceraretencion", "CXP_CODIGO_CABRET"));
            cabeceraRetencion.setCxpCodigoEstRet(estRetencion);
            cabeceraRetencion.setCxpCodigoTipDoc(tipoDocumento);
            cabeceraRetencion.setCxpFechaEmisionCabret(fechaHoy);
            cabeceraRetencion.setCxpNumeroCabret(MessagesController.obtenerkeyautomaticosinceros("cxp_cabeceraretencion", "CXP_NUMERO_CABRET"));
            String numRetencion = cabeceraRetencion.getCxpNumeroCabret();
            numRetencion = MessagesController.LlenarConCeros(numRetencion,  Integer.parseInt(MessagesController.obtenervariable("tam_NumRetencion")));
            cabeceraRetencion.setCxpNumeroCabret(numRetencion);
            cabeceraRetencion.setCxpNumeroDocCabret("");
            cabeceraRetencion.setCxpObservacionCabret("Retencion, N° Fac: " + 
                    Long.parseLong(cabeceraFactura.getCxpNumeroCabfac()) +""
                    + ", Prov: " + cabeceraFactura.getCxpCodigoPro().getCxpNombrePro());
            cabeceraRetencion.setCxpTipoComprobanteCabret("Factura");
            //Llenar Detalle de Retencion
            detalleRetencionAux.setCxpCodigoCabRet(cabeceraRetencion);
            conEstCab.setConCodigoEstCab("2");
            tipoAsiento.setConCodigoTipAsi(MessagesController.obtenervariable("tipAsi_Diario"));
            String nomProveedor = "";
            int lenghtNomPro = cabeceraFactura.getCxpCodigoPro().getCxpNombrePro().length();
            if(lenghtNomPro > 20) 
                nomProveedor=cabeceraFactura.getCxpCodigoPro().getCxpNombrePro().substring(0, 20);
            else 
                nomProveedor=cabeceraFactura.getCxpCodigoPro().getCxpNombrePro().substring(0,lenghtNomPro);
            String descripcion = nomProveedor.concat(", N° Fact " + Long.parseLong(cabeceraFactura.getCxpNumeroCabfac()));
            //Creacion de Cabecera Contable
            cabeceraContable.setConCodigoCabcon(MessagesController.obtenerkeyautomatico("con_cabeceracontable", "CON_CODIGO_CABCON"));
            cabeceraContable.setConCodigoEstcab(conEstCab);
            cabeceraContable.setConCodigoTipasi(tipoAsiento);
            cabeceraContable.setConDescripcionCabcon(descripcion);
            cabeceraContable.setConFechaCabcon(cabeceraFactura.getCxpFechaVencimientoCabfac());
            cabeceraContable.setConModuloCabcon(Constantes.CXP_MODULO);
            cabeceraContable.setConNumeroCabcon(cabeceraFactura.getCxpNumeroCabfac());                        
            cabeceraContable.setCxcProvedor(cabeceraFactura.getCxpCodigoPro());
            /*
             * Cuando ya se trabaje con multiempresas esto se debe quitar y 
             * trabajar con la empresa que se haya elegido al principio
             */
            ConEmpresa empresa = new ConEmpresa();
            empresa.setConCodigoEmp("01");
            cabeceraContable.setConCodigoEmp(empresa);
            //Se agrega al detalleContable el Subtotal.
            Subtotal = Double.valueOf(detalleFactura.getCxpCantidadDetfac());
            detalleContable.setConCantidadDetcon(Subtotal);
            detalleContable.setConCodigoCabcon(cabeceraContable);
            detalleContable.setConCodigoCue(conCuentaAux);
            conLugAplcacion.setConCodigoLugApl(Constantes.LUGARAPLICACION_DEBE);
            detalleContable.setConCodigoLugapl(conLugAplcacion);
            listaDetalleContable.add(detalleContable);
            detalleContable = new ConDetallecontable();
            conLugAplcacion = new ConLugarAplicacion();
            conCuentaAux = new ConCuenta();
            for (int i = 0; i < numDetalles; i++) {                                
                if(aplicaIVA.equals("SI")){ 
                    //Se agrega al detalleContable el iva
                    iva = Subtotal * porcentajeIVA;
                    //conCuentaAux.setConCodigoCue("1.1.2.5.01");
                    conCuentaAux.setConCodigoCue(Constantes.CXP_FACTURA_CUENTAIVA);
                    detalleContable.setConCantidadDetcon(iva);
                    detalleContable.setConCodigoCabcon(cabeceraContable);
                    detalleContable.setConCodigoCue(conCuentaAux);
                    conLugAplcacion.setConCodigoLugApl(Constantes.LUGARAPLICACION_DEBE);
                    detalleContable.setConCodigoLugapl(conLugAplcacion);
                    listaDetalleContable.add(detalleContable);
                    detalleContable = new ConDetallecontable();
                    conCuentaAux = new ConCuenta();
                    conLugAplcacion = new ConLugarAplicacion();
                }
                totalFactAux = iva + Subtotal;
                ValorFacRet = totalFactAux;
                if(aplicaRet.equals("SI")){
                    listaTipConReT = cxpTipoConRetManager.buscarTipoContribuyente(
                            cabeceraFactura.getCxpCodigoPro().getCxpCodigoTipCon(),
                            listaDetalle.get(0).getCxpCodigoRet());
                    for (int j = 0; j < listaTipConReT.size(); j++) {
                        tipoConRet = listaTipConReT.get(j);
                        detalleFactura = listaDetalle.get(i);
                        porcentaje = BigDecimal.valueOf(tipoConRet.getCxpPorcentajeRetencionTipConRet());     
                        lugarAplica = tipoConRet.getCxpCodigoImp().getCxpCodigoImp();                

                        // Retenciones: 1. IVA -- 2. Fuente
                        if(aplicaRet.equals("SI")){
                            if(lugarAplica.equals("1")){
                                //Se calcula retencion iva y se agregan detalleREtencion y detalleContable
                                ivaRetencion = iva * (porcentaje.doubleValue() / 100);
                                ValorFacRet = ValorFacRet - ivaRetencion;
                                detalleRetencionAux.setCxpBaseImponibleDetRet(iva);                            
                                impuesto.setCxpCodigoImp("2");
                                detalleRetencionAux.setCxpCodigoImp(impuesto);
                                detalleRetencionAux.setCxpCodigoRet(tipoConRet.getCxpCodigoRet());
                                detalleRetencionAux.setCxpPorcentajeDetRet(tipoConRet.getCxpPorcentajeRetencionTipConRet());
                                detalleRetencionAux.setCxpValorDetRet(ivaRetencion);
                                detalleContable.setConCantidadDetcon(ivaRetencion);
                                detalleContable.setConCodigoCabcon(cabeceraContable);
                                detalleContable.setConCodigoCue(tipoConRet.getConCodigoCue());
                                conLugAplcacion.setConCodigoLugApl(Constantes.LUGARAPLICACION_HABER);
                                detalleContable.setConCodigoLugapl(conLugAplcacion);
                                listaDetalleContable.add(detalleContable);
                                detalleContable = new ConDetallecontable();
                                conLugAplcacion = new ConLugarAplicacion();
                                listaDetalleRetencion.add(detalleRetencionAux);
                            }else{
                                //Se calcula retencion Fuente y se agregan detalleREtencion y detalleContable
                                retencion = Subtotal * (porcentaje.doubleValue() / 100);
                                ValorFacRet = ValorFacRet - retencion;
                                detalleRetencionAux.setCxpBaseImponibleDetRet(Subtotal);
                                impuesto.setCxpCodigoImp("2");
                                detalleRetencionAux.setCxpCodigoImp(impuesto);
                                detalleRetencionAux.setCxpCodigoRet(tipoConRet.getCxpCodigoRet());
                                detalleRetencionAux.setCxpPorcentajeDetRet(tipoConRet.getCxpPorcentajeRetencionTipConRet());
                                detalleRetencionAux.setCxpValorDetRet(retencion);
                                detalleContable.setConCantidadDetcon(retencion);
                                detalleContable.setConCodigoCabcon(cabeceraContable);
                                detalleContable.setConCodigoCue(tipoConRet.getConCodigoCue());
                                conLugAplcacion.setConCodigoLugApl(Constantes.LUGARAPLICACION_HABER);
                                detalleContable.setConCodigoLugapl(conLugAplcacion);
                                listaDetalleContable.add(detalleContable);
                                detalleContable = new ConDetallecontable();
                                conLugAplcacion = new ConLugarAplicacion();
                                listaDetalleRetencion.add(detalleRetencionAux);
                            }
                        }                    
                    }
                }
                               
            }
            //Agregar key automaticas a la lista de retenciones en Detalle
            
            
            detalleContable.setConCantidadDetcon(ValorFacRet);
            detalleContable.setConCodigoCabcon(cabeceraContable);
            //conCuentaAux.setConCodigoCue("2.1.1.2.01");
            conCuentaAux.setConCodigoCue(Constantes.CXP_FACTURA_CUENTA);
            detalleContable.setConCodigoCue(conCuentaAux);
            conLugAplcacion.setConCodigoLugApl(Constantes.LUGARAPLICACION_HABER);
            detalleContable.setConCodigoLugapl(conLugAplcacion);
            listaDetalleContable.add(detalleContable);
            List<String> listakeyRetencion = MessagesController.obtenerlistakeyautomatico("cxp_detalleretencion", "CXP_CODIGO_DETRET", listaDetalleRetencion.size());
            List<String> listakeyDetFac = MessagesController.obtenerlistakeyautomatico("cxp_detallefactura", "CXP_CODIGO_DETFAC", listaDetalle.size());
            if(listaDetalle.size() >= 1){
                for (int i = 0; i < listaDetalle.size(); i++) {
                    if(listaDetalle.get(i).getCxpCodigoDetfac() == null)
                        listaDetalle.get(i).setCxpCodigoDetfac(listakeyDetFac.get(i));
                }
            }
            if(listaDetalleRetencion.size() >= 1){
                for (int i = 0; i < listaDetalleRetencion.size(); i++) {
                    if(listaDetalleRetencion.get(i).getCxpCodigoDetRet() == null)
                        listaDetalleRetencion.get(i).setCxpCodigoDetRet(listakeyRetencion.get(i));
                }
            }
            List<String> listakeyDetalle = MessagesController.obtenerlistakeyautomatico("con_detallecontable", "CON_CODIGO_DETCON", listaDetalleContable.size());
            for (int i = 0; i < listaDetalleContable.size(); i++) {
                if (listaDetalleContable.get(i).getConCodigoDetcon() == null) {
                    listaDetalleContable.get(i).setConCodigoDetcon(listakeyDetalle.get(i));
                } else {
                    //bandera que verifica si ya esta guardado el asiento para no volver hacerlo
                    Bandera = 0;
                }
            }
            //Si tiene retencion
            if(aplicaRet.equals("SI")){
                if(CxpDetallefacturaManager.create(detalleFactura) == true){
                    if(cxpCabeceraretencionManager.create(cabeceraRetencion) == true){
                        if(cxpDetalleRetencionManager.createbyListDetalle(listaDetalleRetencion) == true){
                            cabeceraFactura.setCxpCodigoCabret(cabeceraRetencion);
                            CxpCabecerafacturaManager.update(cabeceraFactura);
                            if(conCabeceraContableManager.create(cabeceraContable) == true){
                                if(conDetallecontableManager.createbyListDetalle(listaDetalleContable) == true){
                                    detalleFactura = new CxpDetalleFactura();
                                    totalDetalle = new TotalDetalle();
                                    cabeceraRetencion = new CxpCabeceraRetencion();
                                    cabeceraContable = new ConCabeceracontable();
                                    cabeceraFactura = new CxpCabeceraFactura();
                                    listaCabecera = new ArrayList<CxpCabeceraFactura>();
                                    listaCabeceraContable = new ArrayList<ConCabeceracontable>();
                                    listaCabeceraRetencion = new ArrayList<CxpCabeceraRetencion>();
                                    listaDetalle = new ArrayList<CxpDetalleFactura>();
                                    listaDetalleContable = new ArrayList<ConDetallecontable>();
                                    MessagesController.addInfo("El valor del IVA es: " + iva + "\n"
                                        + "\nSe aplica la retencion a: \n"
                                        + "\nRetencion a la fuente: " + retencion + "\n"
                                        + "\nRetencion del IVA: " + ivaRetencion); 
                                    llamarPanelvisible(null);
                                }
                            }
                        }
                    }                
                }else{
                    MessagesController.addError("No se pudo guardar el detalle favor verifique el error");
                    llamarPanelvisible(null);
                }
            }else{// Si no posee Retencion.
                if(CxpDetallefacturaManager.create(detalleFactura) == true){
                    if(conCabeceraContableManager.create(cabeceraContable) == true){
                        if(conDetallecontableManager.createbyListDetalle(listaDetalleContable) == true){
                            detalleFactura = new CxpDetalleFactura();
                            totalDetalle = new TotalDetalle();
                            cabeceraRetencion = new CxpCabeceraRetencion();
                            cabeceraContable = new ConCabeceracontable();
                            cabeceraFactura = new CxpCabeceraFactura();
                            listaCabecera = new ArrayList<CxpCabeceraFactura>();
                            listaCabeceraContable = new ArrayList<ConCabeceracontable>();
                            listaCabeceraRetencion = new ArrayList<CxpCabeceraRetencion>();
                            listaDetalle = new ArrayList<CxpDetalleFactura>();
                            listaDetalleContable = new ArrayList<ConDetallecontable>();
                            MessagesController.addInfo("El valor del IVA es: " + iva + "\n"
                                + "\nNo se aplica Retención\n"); 
                            llamarPanelvisible(null);
                        }
                    }                
                }else{
                    MessagesController.addError("No se pudo guardar el detalle favor verifique el error");
                    llamarPanelvisible(null);
                }
            }
                                
            
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }
    }
    
    public void nuevodetalle(ActionEvent actionEvent) {
        detalleFactura= new CxpDetalleFactura();
        retencionDetalleGroup = new CxpRetencion();
    }

    public String eliminarDetalle() {
        try {
            int Bandera = 1;
            for (int i = 0; i < listaDetalle.size(); i++) {
                if (listaDetalle.get(i).getCxpCodigoDetfac() != null) {
                    //bandera que verifica si ya esta guardado el asiento para no volver hacerlo
                    Bandera = 0;

                }
            }
            if (Bandera == 0) {
                MessagesController.addInfo("Mensaje de Informacion :", "La factura ya se encuentra guardada, no se puede eliminar");
                llamarPanelvisible(null);
            } else {
                if (rowBanderaDetalle >= 0) {
                    listaDetalle.remove(rowBanderaDetalle);
                    totalDetalle = new TotalDetalle();
                    listaTotalDetalle.set(0, totalDetalle);
                }
                rowBanderaDetalle = -1;
                nuevodetalle(null);
            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

        return "index";

    }

    public void insertarDetalle(ActionEvent actionEvent) {
        try {
            if(listaDetalle.size() == 1){
                throw  new Exception("La factura no puede tener mas de un Detalle.");
            }
            int Bandera = 1;
            for (int i = 0; i < listaDetalle.size(); i++) {
                if (listaDetalle.get(i).getCxpCodigoDetfac() != null) {
                    //bandera que verifica si ya esta guardado el asiento para no volver hacerlo
                    Bandera = 0;
                }
            }
            if(Bandera == 0){
                MessagesController.addInfo("Mensaje de Informacion :", "La factura ya se encuentra guardada no se puede modificar");
                llamarPanelvisible(null);
            }else {
                if (cabeceraFactura.getCxpCodigoCabfac() != null) {
                    detalleFactura.setCxpCodigoDetfac(null);                            
                    detalleFactura.setCxpCodigoCabfac((CxpCabeceraFactura) CxpCabecerafacturaManager.getElementById(cabeceraFactura.getCxpCodigoCabfac()));
                    if(detalleFactura.getCxpAplicaRetDetFact().equals("SI")){
                        if(!retencionDetalleGroup.getCxpCodigoRet().equals("-"))
                            detalleFactura.setCxpCodigoRet((CxpRetencion) cxpRetencionManager.getElementById(retencionDetalleGroup.getCxpCodigoRet()));
                        else
                            throw new Exception("Debe elejir una retención");
                    }else
                        detalleFactura.setCxpCodigoRet(null);
                    listaDetalle.add(detalleFactura);
                    detalleFactura = new CxpDetalleFactura();
                    retencionDetalleGroup = new CxpRetencion(); 
                    String striva = listaDetalle.get(0).getCxpAplicaIvaDetFac();
                    double cantidad = 0.0, iva = 0.0;                    
                    if(striva.equals("SI")){
                        iva = Double.parseDouble(MessagesController.obtenervariable("impuesto_IVA"));
                        cantidad =  listaDetalle.get(0).getCxpCantidadDetfac();
                        totalDetalle.setIva2(iva * cantidad);
                        totalDetalle.setTotal(cantidad * (1+iva));
                        listaTotalDetalle.set(0, totalDetalle);
                    }else{
                        iva = 0.0;
                        cantidad =  listaDetalle.get(0).getCxpCantidadDetfac();
                        totalDetalle.setIva2(iva * cantidad);
                        totalDetalle.setTotal(cantidad * (1+iva));
                        listaTotalDetalle.set(0, totalDetalle);
                    }
                } else {
                    MessagesController.addInfo("Mensaje de error :", "Se debe escojer una Cabecera");
                    llamarPanelvisible(null);
                }
            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

    }

    public void modificarDetalle(ActionEvent actionEvent) {
        try {
            if(rowBanderaDetalle >= 0){
                if(detalleFactura.getCxpAplicaRetDetFact().equals("SI")){
                        if(!retencionDetalleGroup.getCxpCodigoRet().equals("-")){
                            detalleFactura.setCxpCodigoRet((CxpRetencion) cxpRetencionManager.getElementById(retencionDetalleGroup.getCxpCodigoRet()));                           
                            String striva = listaDetalle.get(0).getCxpAplicaIvaDetFac();
                            double cantidad = 0.0, iva = 0.0;                    
                            if(striva.equals("SI")){
                                iva = Double.parseDouble(MessagesController.obtenervariable("impuesto_IVA"));
                                cantidad =  listaDetalle.get(0).getCxpCantidadDetfac();
                                totalDetalle.setIva2(iva * cantidad);
                                totalDetalle.setTotal(cantidad * (1+iva));
                                listaTotalDetalle.set(0, totalDetalle);
                            }else{
                                iva = 0.0;
                                cantidad =  listaDetalle.get(0).getCxpCantidadDetfac();
                                totalDetalle.setIva2(iva * cantidad);
                                totalDetalle.setTotal(cantidad * (1+iva));
                                listaTotalDetalle.set(0, totalDetalle);
                            }
                        }else
                            throw new Exception("Debe elejir una retención");
                }else
                    detalleFactura.setCxpCodigoRet(null);
                listaDetalle.set(rowBanderaDetalle, detalleFactura);
            }              
            rowBanderaDetalle = -1;
            detalleFactura = new CxpDetalleFactura();
            retencionDetalleGroup = new CxpRetencion();          
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }


    }

    
    public void rowSelectionListenerCabecera(RowSelectorEvent event) {
        cabeceraFactura = listaCabecera.get(event.getRow());
        listaDetalle = CxpDetallefacturaManager.buscarporcabecera(cabeceraFactura);
        if(listaDetalle.size()>0){
            String striva = listaDetalle.get(0).getCxpAplicaIvaDetFac();
            double cantidad = 0.0, iva = 0.0;                    
            if(striva.equals("SI")){
                iva = Double.parseDouble(MessagesController.obtenervariable("impuesto_IVA"));
                cantidad =  listaDetalle.get(0).getCxpCantidadDetfac();
                totalDetalle.setIva2(iva * cantidad);
                totalDetalle.setTotal(cantidad * (1+iva));
                listaTotalDetalle.set(0, totalDetalle);
            }else{
                iva = 0.0;
                cantidad =  listaDetalle.get(0).getCxpCantidadDetfac();
                totalDetalle.setIva2(iva * cantidad);
                totalDetalle.setTotal(cantidad * (1+iva));
                listaTotalDetalle.set(0, totalDetalle);
            }
        }else{
            totalDetalle = new TotalDetalle();
            listaTotalDetalle.set(0, totalDetalle);
        }
        switchCabecera(cabeceraFactura);

    }

    public void rowSelectionListenerDetalle(RowSelectorEvent event) {
        rowBanderaDetalle = event.getRow();
        detalleFactura = listaDetalle.get(event.getRow());
        switchDetalle(detalleFactura);
    }    
    
    public void switchDetalle(CxpDetalleFactura detalleFact){
        if(detalleFact.getCxpCodigoRet() != null)
            retencionDetalleGroup = detalleFact.getCxpCodigoRet();
        else
            retencionDetalleGroup.setCxpCodigoRet("-");
    }
    
    public List<ConDetallecontable> devolverListaContable(CxpDetalleFactura detalleFactura,
            CxpTipoContribuyenteRetencion tipoConRet){
        
        return null;
    }
}
